package com.课上案例练习.网络编程.UDP编程;


/**
 * UDP：面向非连接、传输不可靠(丢包[数据丢失])、用于传输少量数据(数据报包
 * 模式)、速度快。发送端和接收端
 * 音频视频聊天
 */

import java.io.DataOutputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.UnknownHostException;

/**
 * 客户端接收
 */
public class Client {
    public static void main(String[] args) throws Exception {
        DatagramSocket receive = new DatagramSocket(10010, InetAddress.getByName("localhost"));
        byte[] buf = new byte[1024];
        //数据报包将接受的数据放到字节组里面
        DatagramPacket packet = new DatagramPacket(buf, 1024);
          receive.receive(packet);//如果没有接收到，会一直等待
          //将字节数组转换为字符串
        String str = new String(buf, 0, packet.getLength());
        System.out.println(str);
    }
}

/**
 * 服务端发送
 */
class Server {
    public static void main(String[] args) throws Throwable {
        //此类表示用于发送和接收数据报数据包的套接字。
        //数据报套接字是分组传送服务的发送或接收点。 在数据报套接字上发送或接收的每个数据包都被单独寻址和路由。 从一个机器发送到另一个机器的多个分组可以不同地路由，并且可以以任何顺序到达
        DatagramSocket sent = new DatagramSocket( 10086, InetAddress.getByName("localhost"));
        String str = "苍茫的天涯是我爱！";
//此类表示数据报包，封装了需要传输和接受的数据
        DatagramPacket p = new DatagramPacket(str.getBytes(),//需要发送的数据 byte[]
                str.getBytes().length,//传输数据的长度 byte[]. length
                InetAddress.getByName("localhost"),//指定的ip地址
                10010);//指定的端口号
        //发送数据
        sent.send(p);
        System.out.println("发送成功");

    }
}
